package logic

import (
	da "admin/dao/auth"
	m "admin/models/auth"
	"errors"
)

// MenuLogic 菜单业务逻辑
type MenuLogic struct {
	menuRepoInterface da.MenuRepoInterface
}

// NewMenuLogic 创建新的菜单逻辑实例
// repo: 菜单仓库实例
// 返回值: 菜单逻辑实例指针
func NewMenuLogic(menuRepoInterface da.MenuRepoInterface) *MenuLogic {
	// 使用GORM实现的菜单仓库初始化逻辑实例
	return &MenuLogic{
		menuRepoInterface: menuRepoInterface,
	}
}

// List 获取菜单列表
// 返回值: 菜单列表和错误信息
func (l *MenuLogic) List() ([]m.Menu, error) {
	return l.menuRepoInterface.List()
}

// GetMenuTree 获取菜单树
// 返回值: 菜单树和错误信息
func (l *MenuLogic) GetMenuTree() ([]m.Menu, error) {
	return l.menuRepoInterface.GetMenuTree()
}

// Create 创建菜单
// name: 菜单名称
// parentID: 父级菜单ID
// path: 菜单路径
// icon: 菜单图标
// sort: 排序
// visible: 是否可见
// 返回值: 错误信息
func (l *MenuLogic) Create(name string, parentID uint64, path, icon string, sort, visible int) error {
	// 检查菜单名称是否为空
	if name == "" {
		return errors.New("菜单名称不能为空")
	}
	// 调用仓库层创建菜单
	return l.menuRepoInterface.Create(&m.Menu{
		Name:     name,
		ParentID: int64(parentID),
		Path:     path,
		Icon:     icon,
		Sort:     sort,
		Visible:  visible,
	})
}

// Update 更新菜单
// id: 菜单ID
// name: 菜单名称
// parentID: 父级菜单ID
// path: 菜单路径
// icon: 菜单图标
// sort: 排序
// visible: 是否可见
// 返回值: 错误信息
func (l *MenuLogic) Update(id, parentID int64, name, path, icon string, sort, visible int) error {
	// 检查菜单ID是否有效
	if id == 0 {
		return errors.New("菜单ID不能为空")
	}
	// 检查菜单名称是否为空
	if name == "" {
		return errors.New("菜单名称不能为空")
	}
	// 调用仓库层更新菜单
	return l.menuRepoInterface.Update(&m.Menu{
		ID:       id,
		Name:     name,
		ParentID: parentID,
		Path:     path,
		Icon:     icon,
		Sort:     sort,
		Visible:  visible,
	})
}

// Delete 删除菜单
// id: 菜单ID
// 返回值: 错误信息
func (l *MenuLogic) Delete(id int64) error {
	// 检查菜单ID是否有效
	if id == 0 {
		return errors.New("菜单ID不能为空")
	}
	// 调用仓库层删除菜单
	return l.menuRepoInterface.Delete(id)
}

// GetMenuByID 根据ID获取菜单
// id: 菜单ID
// 返回值: 菜单对象和错误信息
func (l *MenuLogic) GetMenuByID(id int64) (*m.Menu, error) {
	// 检查菜单ID是否有效
	if id == 0 {
		return nil, errors.New("菜单ID不能为空")
	}
	return l.menuRepoInterface.GetMenuByID(id)
}
